package com.yy.web.pm.until;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 随机编号生成工具类
 */
public class CodeGenerator {

    // 定义常用字符集
    private static final String NUMBERS = "0123456789";
    private static final String LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String LETTERS_NUMBERS = LETTERS + NUMBERS;

    /**
     * 生成纯数字随机编号
     * @param length 编号长度
     * @return 随机数字编号
     */
    public static String generateNumberCode(int length) {
        if (length <= 0) {
            throw new IllegalArgumentException("长度必须大于0");
        }
        return generateRandomCode(NUMBERS, length);
    }

    /**
     * 生成纯字母随机编号
     * @param length 编号长度
     * @return 随机字母编号
     */
    public static String generateLetterCode(int length) {
        if (length <= 0) {
            throw new IllegalArgumentException("长度必须大于0");
        }
        return generateRandomCode(LETTERS, length);
    }

    /**
     * 生成字母+数字混合随机编号
     * @param length 编号长度
     * @return 随机字母数字编号
     */
    public static String generateAlphanumericCode(int length) {
        if (length <= 0) {
            throw new IllegalArgumentException("长度必须大于0");
        }
        return generateRandomCode(LETTERS_NUMBERS, length);
    }

    /**
     * 生成带前缀的日期时间随机编号（格式：前缀+年月日时分秒+随机数）
     * @param prefix 编号前缀
     * @param randomLength 随机数长度
     * @return 带时间戳的随机编号
     */
    public static String generateTimestampCode(String prefix, int randomLength) {
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        String randomStr = generateNumberCode(randomLength);
        return (prefix != null ? prefix : "") + timestamp + randomStr;
    }

    /**
     * 生成订单号（格式：年月日时分秒+6位随机数）
     * @return 订单编号
     */
    public static String generateOrderNo() {
        return generateTimestampCode("", 6);
    }

    /**
     * 生成UUID简化版（去横线，转大写）
     * @return 简化的UUID
     */
    public static String generateShortUuid() {
        return java.util.UUID.randomUUID().toString().replace("-", "").toUpperCase();
    }

    /**
     * 基础随机字符串生成方法
     * @param charSet 字符集
     * @param length 生成长度
     * @return 随机字符串
     */
    private static String generateRandomCode(String charSet, int length) {
        Random random = ThreadLocalRandom.current();
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(charSet.length());
            sb.append(charSet.charAt(index));
        }
        return sb.toString();
    }

    // 示例用法
    public static void main(String[] args) {
        System.out.println("6位数字验证码: " + generateNumberCode(6));
        System.out.println("8位字母编号: " + generateLetterCode(8));
        System.out.println("10位混合编号: " + generateAlphanumericCode(10));
        System.out.println("订单编号: " + generateOrderNo());
        System.out.println("告警编号: " + generateTimestampCode("AL", 4));
        System.out.println("简化UUID: " + generateShortUuid());
    }
}
